#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <vector>

#define N 3

class Thread
{
public:
    Thread(std::string name = "thread", int num = 0)
        : _name(name), _num(num)
    {}

    std::string get_name()
    {
        return _name;
    }

    int get_num()
    {
        return _num;
    }

private:
    std::string _name;
    int _num;
};


void *down_load(void *args)
{
    Thread* pth = static_cast<Thread*>(args);
    int cnt = 0;
    while (true)
    {
        std::cout << pth->get_name() << " is down load....., num: " << pth->get_num() << std::endl;
        sleep(1);
        if(++cnt == 3)
        {
            break;
        }
    }

    return (void *)"down_load";// return 返回
}

void *print(void *args)
{
    Thread* pth = static_cast<Thread*>(args);
    int cnt = 0;
    while (true)
    {
        std::cout << pth->get_name() << " is print....., num: " << pth->get_num() << std::endl;
        sleep(1);
        if(++cnt == 3)
        {
            break;
        }
    }

    pthread_exit((void *)"print");//pthread_exit 退出
}

void *do_other(void *args)
{
    Thread* pth = static_cast<Thread*>(args);
    int cnt = 0;
    while (true)
    {
        std::cout << pth->get_name() << " is do_other....., num: " << pth->get_num() << std::endl;
        sleep(1);
    }

    return (void *)"do_other...";// 执行中途取消
}

int main()
{
    std::vector<pthread_t> tids;
    void*(*mth[N])(void*) = {down_load, print, do_other};// 函数指针数组
    // 创建 N 个线程，并派发任务
    for (int i = 0; i < N; i++)
    {
        Thread* pth = new Thread("thread_"+std::to_string(i), i);
        pthread_t tid;
        pthread_create(&tid, nullptr, mth[i], (void*)pth);
        // 将这一批进程管理起来
        tids.push_back(tid);
    }

    // 等待 print 线程
    void* ret = nullptr;
    pthread_join(tids[0], &ret);
    std::cout << "pthread——join  print retval : " << (const char*)ret << std::endl;
    sleep(3);

    // 等待 down_load 线程
    ret = nullptr;
    pthread_join(tids[1], &ret);
    std::cout << "pthread——join  down_load retval : " << (const char*)ret << std::endl;
    sleep(3);

    // 取消 并等待 do_other 线程
    pthread_cancel(tids[2]);
    ret = nullptr;
    pthread_join(tids[2], &ret);
    std::cout << "pthread——join  do_other retval : " << (long long int)ret << std::endl;

    return 0;
}

// class Thread
// {
// public:
//     std::string name;
//     int num;
// };

// // 新线程执行的任务函数
// void* ThreadRun(void* args)
// {
//     Thread* pth = static_cast<Thread*>(args);
//     while (pth->num)
//     {
//         std::cout << pth->name << " is run...., num: " << pth->num-- << std::endl;
//         sleep(1);
//     }

//     pth->name = "ret";

//     pthread_exit((void*)10);
//     // return (void*)pth;
// }

// int main()
// {
//     pthread_t tid;// 线程的id
//     Thread* pth = new Thread();
//     pth->name = "thread-1";
//     pth->num = 10;
//     int n = pthread_create(&tid, nullptr, ThreadRun, (void*)pth);// 创建一个线程
//     if(n != 0) // 创建失败
//     {
//         std::cerr << "pthread_create failed!" << std::endl;
//         return 1;
//     }

//     // 主线程
//     std::cerr << "pthread_join begin..." << std::endl;
//     void* ret = nullptr;
//     n = pthread_join(tid,nullptr);
//     if(n == 0) // 创建失败
//     {
//         std::cerr << "thread join success..."<< std::endl;
//         // Thread* pth = static_cast<Thread*>(ret);
//         // std::cerr << "thread join success..., retname: "<< pth->name << "  retnum: " << pth->num << std::endl;
//         // delete pth;
//     }

//     return 0;
// }

// class Thread
// {
// public:
//     std::string name;
//     int num;
// };

// // 新线程执行的任务函数
// void* ThreadRun(void* args)
// {
//     Thread* pth = static_cast<Thread*>(args);
//     while (pth->num)
//     {
//         std::cout << pth->name << " is run...., num: " << pth->num-- << std::endl;
//         sleep(1);
//     }

//     pth->name = "ret";

//     return (void*)pth;
// }

// int main()
// {
//     pthread_t tid;// 线程的id
//     Thread* pth = new Thread();
//     pth->name = "thread-1";
//     pth->num = 10;
//     int n = pthread_create(&tid, nullptr, ThreadRun, (void*)pth);// 创建一个线程
//     if(n != 0) // 创建失败
//     {
//         std::cerr << "pthread_create failed!" << std::endl;
//         return 1;
//     }

//     // 主线程
//     std::cerr << "pthread_join begin..." << std::endl;
//     void* ret = nullptr;
//     n = pthread_join(tid, &ret);
//     if(n == 0) // 创建失败
//     {
//         Thread* pth = static_cast<Thread*>(ret);
//         std::cerr << "thread join success..., retname: "<<  pth->name << " retnum: " << pth->num << std::endl;
//         delete pth;// 记得释放空间
//     }

//     return 0;
// }

// class Thread
// {
// public:
//     std::string name;
//     int num;
// };

// // 新线程执行的任务函数
// void* ThreadRun(void* args)
// {
//     Thread* pth = static_cast<Thread*>(args);
//     while (true)
//     {
//         std::cout << pth->name << " is run...., num: " << pth->num << std::endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;// 线程的id
//     Thread* pth = new Thread();
//     pth->name = "thread-1";
//     pth->num = 10;
//     // int n = pthread_create(&tid, nullptr, ThreadRun, (void*)"thread-1");// 创建一个线程
//     int n = pthread_create(&tid, nullptr, ThreadRun, (void*)pth);// 创建一个线程
//     if(n != 0) // 创建失败
//     {
//         std::cerr << "pthread_create failed!" << std::endl;
//         return 1;
//     }

//     // 主线程
//     while (true)
//     {
//         std::cout << "main thread, run...." << std::endl;
//         sleep(1);
//     }

//     return 0;
// }